package com.nifostasky.blog.controller;



import com.google.code.kaptcha.impl.DefaultKaptcha;
import com.nifostasky.service.SysCapchaService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.web.bind.annotation.*;

import javax.imageio.ImageIO;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.awt.image.BufferedImage;
import java.io.IOException;

/**
 *
 *
 * 谷歌提供的 常见验证码生成包; 1.提供一张图片;输入图片中的字符;
*                          2.提供一张图片;输入图片中算式的运算结果;
 *
 * (SysCapcha)表控制层
 *
 * @author makejava
 * @since 2021-09-24 10:03:19
 */
@RestController
@RequestMapping("/sysCapcha")
public class SysCapchaController {
    @Autowired
    private SysCapchaService sysCapchaService;

    @Autowired
    @Qualifier("captchaProducer")
    private DefaultKaptcha captchaProducer;

    @Autowired
    @Qualifier("captchaProducerMath")
    private DefaultKaptcha captchaProducerMath;

    /**
     * 验证码生成
     */
    @GetMapping("getKaptchaImage")
    public void getKaptchaImage(HttpServletRequest request, HttpServletResponse response){
        ServletOutputStream out = null;
        try
        {
            HttpSession session = request.getSession();
            /**
             * 设置response
             */
            //该方法把指定的头名称以及日期设置为响应头信息，其中日期用 long 类型的值表示，其值是从新纪元开始算起的毫秒数。
            response.setDateHeader("Expires", 0);

            //`这两个方法都是用于设置 `HTTP` 协议的响应头字段。
            // 其中，参数 `name` 用于指定响应头字段的名称，参数 `value` 用于指定响应头字段的值。
            // 不同的是，`addHeader()` 方法可以增加同名的响应头字段，而 `setHeader()` 方法则会覆盖同名的头字段
            response.setHeader("Cache-Control", "no-store, no-cache, must-revalidate");
            response.addHeader("Cache-Control", "post-check=0, pre-check=0");
            response.setHeader("Pragma", "no-cache");

            //该方法用于设置` Servlet` 输出内容的 `MIME` 类型，
            // 对于 `HTTP` 协议来说，就是设置 `Content-Type` 响应头字段的值。
            // 例如，如果发送到客户端的内容是 `jpeg` 格式的图像数据,就需要将响应头字段的类型设置为 `image/jpeg`。
            // 需要注意的是，如果响应的内容为文本，`setContentType()` 方法还可以设置字符编码，如 `text/html;charset = UTF-8`
            response.setContentType("image/jpeg");

            /**
             * 获取请求参数
             */
            //获取请求内容
            String type = request.getParameter("type");
            String uuid = request.getParameter("uuid");

            /**
             * 生成验证码的逻辑
             */
            BufferedImage bi = sysCapchaService.getCaptcha(type,uuid);
//            session.setAttribute(Constants.KAPTCHA_SESSION_KEY, code);

            /**
             * 发送生成的验证码图片
             */
            //准备发送图片
            out = response.getOutputStream();
            ImageIO.write(bi, "jpg", out);
            //将图片发送给客户端;内存 -> 输出流 -> 网络 中;
            out.flush();
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
        finally
        {
            try
            {
                if (out != null)
                {
                    out.close();
                }
            }
            catch (IOException e)
            {
                e.printStackTrace();
            }
        }
    }

    /**
     * 验证验证码是否正确
     */
    @GetMapping("/validCode")
    public Boolean validCode(String code,String uuid){
        return sysCapchaService.validCaptcha(uuid,code);
    }


}
